package com.crm.system.service.trainingManager;

import com.crm.common.exception.FastDFSException;
import com.crm.common.model.DhPageInfo;
import com.crm.model.entity.customerManager.Customer;
import com.crm.model.entity.trainingManager.Training;
import com.crm.model.entity.trainingManager.TrainingContact;
import com.crm.model.entity.trainingManager.TrainingDemand;
import com.crm.model.entity.trainingManager.TrainingDemandItem;
import com.crm.model.qo.trainingManager.AddTrainingQO;
import com.crm.model.qo.trainingManager.TrainingFormQO;
import com.crm.model.qo.trainingManager.TrainingQO;
import com.crm.model.vo.trainingManager.TrainingDetailVO;
import com.crm.model.vo.trainingManager.TrainingFormVO;
import com.crm.model.vo.trainingManager.TrainingVO;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

/**
 * 联系人管理信息
 */
public interface TrainingService {

    /**
     * 用户模块 -- 内训管理列表
     *
     * @param pageIndex 页码
     * @param pageSize  分页大小
     * @param sortName  排序列名字
     * @param sortOrder 排序规则(asc/desc)
     * @param trainingQO 查询条件
     * @return
     */
    DhPageInfo<TrainingVO> selectTrainingList(Integer pageIndex, Integer pageSize, TrainingQO trainingQO, String sortName, String sortOrder);

    /**
     * 内训管理-新增内训
     * @param training 新增内训实体
     * @return
     */
    String addTraining(AddTrainingQO training);

    /**
     * 内训详情-通过内训id查询内训详情
     * @param trainingId 内训id
     * @return
     */
    TrainingVO selectByTrainingId(String trainingId);

    /**
     * 内训管理-新增内训
     * @param trainingDemand 新增内训需求实体
     * @return
     */
    Boolean addTrainingDemand(TrainingDemand trainingDemand);

    /**
     * 用户模块 -- 内训管理信息
     * @param trainingId 内训线索id
     * @return
     */
    TrainingDemand selectTrainingDemand(String trainingId);

    /**
     * 内训管理-新增内训需求项
     * @param trainingDemandItem 新增内训需求项实体
     * @return
     */
    String addTrainingDemandItem(TrainingDemandItem trainingDemandItem);

    /**
     * 用户模块 -- 内训管理项列表
     * @param pageIndex 页码
     * @param pageSize  分页大小
     * @param sortName  排序列名字
     * @param sortOrder 排序规则(asc/desc)
     * @param trainingId 内训线索id
     * @return
     */
    DhPageInfo<TrainingDemandItem> selectTrainingDemandItemList(Integer pageIndex, Integer pageSize, String trainingId, String sortName, String sortOrder);

    /**
     * 用户模块 -- 内训联系人信息
     * @param pageIndex 页码
     * @param pageSize  分页大小
     * @param sortName  排序列名字
     * @param sortOrder 排序规则(asc/desc)
     * @param trainingId 内训线索id
     * @return
     */
    DhPageInfo<TrainingContact> selectTrainingContactList(Integer pageIndex, Integer pageSize, String trainingId, String sortName, String sortOrder);

    /**
     * 内训管理-内训详情-新增联系人到内训联系人下
     * @param trainingContact 内训联系人实体
     * @return
     */
    Boolean addTrainingContact(TrainingContact trainingContact);

    /**
     *内训详情-内训联系人 开启/废止联系人
     * @param trainingContact 废止内训联系人实体
     * @return
     */
    Boolean updateAbolishStateById(TrainingContact trainingContact);

    /**
     * 用户模块 -- 内训详情 -- 同一内训线索下内训联系人的联系方式不能相同
     * @param trainingId 内训线索id
     * @param contactInformation 联系方式
     * @return
     */
    TrainingContact getTrainingIdAndContactInformation(String trainingId, String contactInformation);

    /**
     * 内训管理-内训详情-修改联系人到内训联系人下
     * @param trainingContact 内训联系人实体
     * @return
     */
    Boolean updateTrainingContact(TrainingContact trainingContact);

    /**
     * 用户模块 -- 内训详情 -- 修改联系人回显
     * @param trainingContactId 联系人id
     * @return
     */
    TrainingContact getTrainingContact(String trainingContactId);

    /**
     * 管理模块--内训线索池列表
     * @param pageIndex/pageSize 页码/分页大小
     * @param trainingFormQO     查询条件
     * @param sortName/sortOrder 排序列名/排序规则(ASC/DESC)
     * @author yincuimei
     * @return
     */
    DhPageInfo<TrainingFormVO> selectTrainingFormVOList(Integer pageIndex, Integer pageSize, TrainingFormQO trainingFormQO, String sortName, String sortOrder);

    /**
     * 管理模块-》内训线索池列表-》内训详情
     * @param trainingId  --内训ID
     * @author yincuimei
     * @return
     */
    TrainingDetailVO selectTrainingDetailVOById(String trainingId);

    /**
     * 管理模块-》内训线索池列表-》内训详情-》编辑内训
     * @param training
     * @author yincuimei
     * @return
     */
    Boolean updateTrainingById(Training training);

    /**
     * 管理模块-》内训线索池列表-》内训详情-》编辑客户图片
     * @param customer
     * @author yincuimei
     * @return
     */
    Boolean updateCustomerImg(Customer customer, MultipartFile multipartFile)throws FastDFSException;

    /**
     * 分配线索
     * @Author renshaorong
     * @Date 2021/9/24
     * @param trainingId
     * @param userId
     * @return
     */
    @Transactional(rollbackFor = {RuntimeException.class, Error.class})
    String distribute(String trainingId, String userId);
}
